#ifndef __TFT180_H_
#define __TFT180_H_

#include "headfile.h"
#include "device_font.h"

#define FB_TFT180_DEVICE "/dev/fb0"
#define TFT180_DEFAULT_BGCOLOR          (RGB565_WHITE)                          // 默认的背景颜色
#define TFT180_DEFAULT_PENCOLOR         (RGB565_BLACK)                          // 默认的画笔颜色
#define TFT180_DEFAULT_DISPLAY_FONT     (TFT180_6X8_FONT)                       // 默认的字体模式
#define     func_abs(x)             ((x) >= 0 ? (x): -(x))

class TFT180
{
public:

    TFT180(void);
    ~TFT180();
    int TFT180_init(void);
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     画点
// 参数说明     x           x
// 参数说明     y           y
// 参数说明     color       颜色
// 返回参数     void
// 使用示例     drawPoint(0, 0, RGB565_BLACK);
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
    void drawPoint(int x, int y, unsigned short color);
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     TFT180 清屏函数
// 返回参数     void
// 使用示例     clearScreen();
// 备注信息     恢复成默认背景色
//-------------------------------------------------------------------------------------------------------------------
    void clearScreen(void);
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     TFT180 显示字符
// 参数说明     x               坐标x方向的起点 参数范围 [0, tft180_width_max-1]
// 参数说明     y               坐标y方向的起点 参数范围 [0, tft180_height_max-1]
// 参数说明     dat             需要显示的字符
// 返回参数     void
// 使用示例     showChar(0, 0, 'x');                    // 坐标 0,0 写一个字符 x
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
    void showChar(int x, int y, const char dat);
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     TFT180 显示字符串
// 参数说明     x               坐标x方向的起点 参数范围 [0, tft180_width_max-1]
// 参数说明     y               坐标y方向的起点 参数范围 [0, tft180_height_max-1]
// 参数说明     dat             需要显示的字符串
// 返回参数     void
// 使用示例     showString(0, 0, "seekfree");
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
    void showString(int x, int y, const char dat[]);
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     TFT180 显示32位有符号 (去除整数部分无效的0)
// 参数说明     x               坐标x方向的起点 参数范围 [0, tft180_width_max-1]
// 参数说明     y               坐标y方向的起点 参数范围 [0, tft180_height_max-1]
// 参数说明     dat             需要显示的变量 数据类型 int32
// 参数说明     num             需要显示的位数 最高10位  不包含正负号
// 返回参数     void
// 使用示例     showInt(0, 0, x, 3);                    // x 可以为 int32 int16 int8 类型
// 备注信息     负数会显示一个 ‘-’号
//-------------------------------------------------------------------------------------------------------------------
    void showInt(int x, int y, int dat, int num);
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     TFT180 显示32位无符号 (去除整数部分无效的0)
// 参数说明     x               坐标x方向的起点 参数范围 [0, tft180_width_max-1]
// 参数说明     y               坐标y方向的起点 参数范围 [0, tft180_height_max-1]
// 参数说明     dat             需要显示的变量 数据类型 uint32
// 参数说明     num             需要显示的位数 最高10位  不包含正负号
// 返回参数     void
// 使用示例     showUint(0, 0, x, 3);                   // x 可以为 uint32 uint16 uint8 类型
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
    void showUInt(int x, int y, int dat, int num);
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     TFT180 显示浮点数(去除整数部分无效的0)
// 参数说明     x               坐标x方向的起点 参数范围 [0, tft180_width_max-1]
// 参数说明     y               坐标y方向的起点 参数范围 [0, tft180_height_max-1]
// 参数说明     dat             需要显示的变量 数据类型 double
// 参数说明     num             整数位显示长度   最高8位
// 参数说明     pointnum        小数位显示长度   最高6位
// 返回参数     void
// 使用示例     showFloat(0, 0, x, 2, 3);               // 显示浮点数   整数显示2位   小数显示三位
// 备注信息     特别注意当发现小数部分显示的值与你写入的值不一样的时候，
//              可能是由于浮点数精度丢失问题导致的，这并不是显示函数的问题，
//              有关问题的详情，请自行百度学习   浮点数精度丢失问题。
//              负数会显示一个 ‘-’号
//-------------------------------------------------------------------------------------------------------------------
    void showFloat (int x, int y, const double dat, unsigned char num, unsigned char pointnum);
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     TFT180 显示OpenCV图像 (BGR格式)
// 参数说明     x               坐标x方向的起点 
// 参数说明     y               坐标y方向的起点 
// 参数说明     image           OpenCV的Mat对象（支持BGR/RGB格式）
// 参数说明     target_width    目标宽度
// 参数说明     target_height   目标高度
// 返回参数     void
// 使用示例     showCVImage(0, 0, img, 128, 96);
// 备注信息     自动处理BGR转RGB565，支持图像缩放
//-------------------------------------------------------------------------------------------------------------------
    void showCVImage(int x, int y, const cv::Mat& image, int target_width, int target_height);

private:
    int fd;                       //设备是否存在
    struct fb_fix_screeninfo fix_screeninfo;    //屏幕固定信息
    struct fb_var_screeninfo var_screeninfo;    //屏幕可变信息
    long int screensize;                        //缓冲帧大小
    char *fbp = nullptr;                        // 帧缓冲内存指针

    unsigned short tft180_bgcolor = TFT180_DEFAULT_BGCOLOR;           // 背景颜色
    unsigned short tft180_pencolo = TFT180_DEFAULT_PENCOLOR;          // 画笔颜色(字体色)
    tft180_font_size_enum    tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT;      // 显示字体类型

    void drawPixel(int x, int y, unsigned short color);

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     整形数字转字符串 数据范围是 [-32768,32767]
// 参数说明     *str            字符串指针
// 参数说明     number          传入的数据
// 返回参数     void
// 使用示例     func_int_to_str(data_buffer, -300);
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
    void func_int_to_str (char *str, int number);
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     整形数字转字符串 数据范围是 [0,65535]
// 参数说明     *str            字符串指针
// 参数说明     number          传入的数据
// 返回参数     void
// 使用示例     func_uint_to_str(data_buffer, 300);
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
    void func_uint_to_str (char *str, unsigned int number);
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     浮点数字转字符串
// 参数说明     *str            字符串指针
// 参数说明     number          传入的数据
// 参数说明     point_bit       小数点精度
// 返回参数     void
// 使用示例     func_double_to_str(data_buffer, 3.1415, 2);                     // 结果输出 data_buffer = "3.14"
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
    void func_double_to_str (char *str, double number, unsigned char point_bit);
};

extern TFT180 tft180;

#endif
